home *** CD-ROM | disk | FTP | other *** search
/ SPACE 2 / SPACE - Library 2 - Volume 1.iso / program / 670 / crpdials / crpdials.gfa (.txt) next >
Encoding:
GFA-BASIC Atari  |  1992-10-14  |  23.1 KB  |  981 lines

  1. ' ###############################
  2. ' #                             #
  3. ' #      "CreepDials"-Demo      #
  4. ' #      ~~~~~~~~~~~~~~~~~      #
  5. ' #                             #
  6. ' #      für GFA-Basic 3.x      #
  7. ' #                             #
  8. ' #      von Manuel Hermann     #
  9. ' #   (c) 1992 by TOS-Magazin   #
  10. ' #                             #
  11. ' ###############################
  12. '
  13. RESERVE 50*1024
  14. '
  15. ' Resource Datei Indizes für CRP_DIAL
  16. LET popup&=0                                       !Formular/Dialog
  17. LET sex_box&=1                                     !BOX in Baum POPUP
  18. LET option_box&=4                                  !BOX in Baum POPUP
  19. LET info&=1                                        !Formular/Dialog
  20. LET inf_abbr&=11                                   !BUTTON in Baum INFO
  21. LET demo&=12                                       !BUTTON in Baum INFO
  22. '
  23. LET dialog&=2                                      !Formular/Dialog
  24. LET name&=3                                        !FTEXT in Baum DIALOG
  25. LET sex&=4                                         !STRING in Baum DIALOG
  26. LET sex_but&=5                                     !BOXTEXT in Baum DIALOG
  27. LET basic&=7                                       !BUTTON in Baum DIALOG
  28. LET pascal&=8                                      !BUTTON in Baum DIALOG
  29. LET c&=9                                           !BUTTON in Baum DIALOG
  30. LET modula&=10                                     !BUTTON in Baum DIALOG
  31. LET assembl&=11                                    !BUTTON in Baum DIALOG
  32. LET a1040&=13                                      !BUTTON in Baum DIALOG
  33. LET mega&=14                                       !BUTTON in Baum DIALOG
  34. LET st_book&=15                                    !BUTTON in Baum DIALOG
  35. LET tt&=16                                         !BUTTON in Baum DIALOG
  36. LET falcon&=17                                     !BUTTON in Baum DIALOG
  37. LET option&=18                                     !BOXTEXT in Baum DIALOG
  38. LET demo_abbr&=19                                  !BUTTON in Baum DIALOG
  39. LET demo_ok&=20                                    !BUTTON in Baum DIALOG
  40. '
  41. LET what_but&=3                                    !Formular/Dialog
  42. LET b_ind&=4                                       !STRING in Baum WHAT_BUT
  43. LET b_text&=6                                      !STRING in Baum WHAT_BUT
  44. LET b_ok&=7                                        !BUTTON in Baum WHAT_BUT
  45. '
  46. '
  47. IF RSRC_LOAD("CRPDIALS.RSC")=0
  48.   ALERT 3,"| Kein RSC-File.  ",1,"Abbruch",dummy|
  49. ELSE
  50.   '
  51.   DEFMOUSE 0
  52.   '
  53.   ALERT 2,"| --- CreepDials ---| |Form der Radiobuttons: ",2," eckig |rund",r|
  54.   r!=PRED(r|)
  55.   '
  56.   ALERT 2,"| --- CreepDials ---| | Aussehen der Ecke:   ",2,"FlyDials|7UP",e|
  57.   e!=PRED(e|)
  58.   '
  59.   ALERT 2,"| Dialoge realtiv zur  | Maus ausrichten?   ",2," Nein |Ja",m|
  60.   m!=PRED(m|)
  61.   '
  62.   ' einmalig nach dem Laden der RSC-Datei aufrufen:
  63.   '
  64.   prepare_rsc(what_but&,popup&,r!,e!,m!)
  65.   '
  66.   IF error%
  67.     '
  68.     DO
  69.       '
  70.       ' Dialog darstellen und verwalten:
  71.       '
  72.       do_dial(info&,button&)
  73.       EXIT IF button&=inf_abbr&
  74.       '
  75.       CHAR{{OB_SPEC(t_a%(dialog&),name&)}}="Otto Normaluser"
  76.       do_dial(dialog&,button&)
  77.       '
  78.       CHAR{OB_SPEC(t_a%(what_but&),b_ind&)}=STR$(button&)
  79.       CHAR{OB_SPEC(t_a%(what_but&),b_text&)}=CHAR{OB_SPEC(t_a%(dialog&),button&)}
  80.       do_dial(what_but&,button&)
  81.       '
  82.     LOOP
  83.     '
  84.     ' reservierten Speicherblock wieder freigeben:
  85.     '
  86.     mem_free
  87.     '
  88.   ELSE
  89.     ALERT 3,"|Programm kann wegen|Speichermangel nicht|ausgeführt werden.  ",1,"  OK  ",dummy|
  90.   ENDIF
  91.   '
  92.   ~RSRC_FREE()
  93.   '
  94. ENDIF
  95. '
  96. EDIT
  97. '
  98. '
  99. ' *****************************************************************************
  100. '
  101. '  "CreepDials"-Library für GFA-Basic 3.x
  102. '
  103. '  Autor:       Manuel Hermann
  104. '  Betatester:  Anton Stepper ("Vielen Dank!")
  105. '
  106. '  (c) 1992 by TOS-Magazin
  107. '
  108. ' *****************************************************************************
  109. '
  110. ' ACHTUNG:
  111. ' Falls die "CreepDials"-Library mit MERGE eingefügt wurde, muß im
  112. ' Unterprogramm 'assm_modul' die Datei 'CRPDIALS.INL' nachgeladen werden.
  113. ' In der Prozedur 'do_dial' wird die Library an eigene Popups angepasst.
  114. '
  115. > PROCEDURE assm_modul                             !Assemblermodul (Nachladen!)
  116.   '
  117.   ' Folgende Zeile reserviert 996 Bytes für das benötigte Assemblermodul.
  118.   ' Mit Cursor in der Befehlszeile und 'HELP' kann die Datei 'CRPDIALS.INL'
  119.   ' geladen werden. (siehe GFA-Handbuch unter INLINE)
  120.   '
  121. ' ## INLINE:
  122. ' $0000: 00 0c 37 9a 00 04 00 08 00 10 20 2f 00 04 48 e7 
  123. ' $0010: 7f fe 2c 40 2a 7a ff ea 3e 3a ff ea 49 fa 02 ac 
  124. ' $0020: 70 00 61 00 02 be 4c ae 00 03 00 0a d0 7a ff d8 
  125. ' $0030: 34 2e 00 10 e2 42 36 02 d2 42 53 41 34 3a ff c8 
  126. ' $0040: 53 42 38 3a ff c4 b8 7c 00 08 67 02 53 43 48 94 
  127. ' $0050: 00 0f 61 00 02 7e 30 2e 00 08 c0 7c 00 01 67 00 
  128. ' $0060: 00 e6 70 01 61 00 02 7c 4c 94 00 0f 57 42 57 43 
  129. ' $0070: 38 3a ff 96 b8 7c 00 08 66 04 53 42 52 43 61 00 
  130. ' $0080: 02 52 60 00 00 c2 20 2f 00 04 48 e7 7f fe 2c 40 
  131. ' $0090: 2a 7a ff 6e 3e 3a ff 6e 49 fa 02 30 70 00 61 00 
  132. ' $00a0: 02 42 4c ae 00 0f 00 0a 52 40 52 41 d6 41 34 00 
  133. ' $00b0: d4 7a ff 54 d4 7a ff 50 57 42 57 43 48 94 00 0f 
  134. ' $00c0: 61 00 02 2e 30 2e 00 08 c0 7c 00 01 67 78 70 01 
  135. ' $00d0: 61 00 02 10 4c 94 00 0f 56 40 56 41 57 42 57 43 
  136. ' $00e0: 61 00 02 0e 60 60 20 2f 00 04 48 e7 7f fe 2c 40 
  137. ' $00f0: 2a 7a ff 0e 3e 3a ff 0e 49 fa 01 d0 70 00 61 00 
  138. ' $0100: 01 e2 4c ae 00 0f 00 0a d6 41 34 00 d4 7a fe f8 
  139. ' $0110: d4 7a fe f4 55 42 55 43 48 94 00 0f 61 00 01 d2 
  140. ' $0120: 30 2e 00 08 c0 7c 00 01 67 1c 4c 94 00 0f 61 00 
  141. ' $0130: 01 d0 4c 94 00 0f d2 6e 00 10 96 6e 00 10 55 41 
  142. ' $0140: 54 43 61 00 01 bc 4c ae 00 03 00 0a d0 7a fe b8 
  143. ' $0150: d0 7a fe b4 d0 7a fe b0 34 2e 00 10 36 3a fe aa 
  144. ' $0160: e6 43 94 43 d2 42 53 41 24 2e 00 1a 61 00 01 ae 
  145. ' $0170: 30 2e 00 08 08 80 00 00 4c df 7f fe 4e 75 20 2f 
  146. ' $0180: 00 04 48 e7 7f fe 2c 40 2a 7a fe 76 3e 3a fe 76 
  147. ' $0190: 49 fa 01 38 70 00 61 00 01 4a 4c ae 00 0f 00 0a 
  148. ' $01a0: d4 40 d6 41 38 3a fe 62 e2 44 d2 44 e2 44 d2 44 
  149. ' $01b0: 38 80 39 41 00 02 61 00 01 38 39 7c ff ff 00 04 
  150. ' $01c0: 4c 94 00 03 d0 7a fe 40 34 3a fe 3e e4 42 d2 42 
  151. ' $01d0: 24 2e 00 1a 61 00 01 46 42 40 4c df 7f fe 4e 75 
  152. ' $01e0: 20 2f 00 04 48 e7 7f fe 2c 40 2a 7a fe 14 3e 3a 
  153. ' $01f0: fe 14 49 fa 00 d6 39 7c ff ff 00 04 4c ae 00 03 
  154. ' $0200: 00 0a d2 6e 00 10 24 2e 00 1a 61 00 01 10 4c ae 
  155. ' $0210: 00 07 00 0a d4 40 d2 6e 00 10 36 3a fd ec e6 43 
  156. ' $0220: d2 43 52 41 36 01 61 00 00 d8 42 40 4c df 7f fe 
  157. ' $0230: 4e 75 20 2f 00 04 48 e7 7f fe 2c 40 2a 7a fd c2 
  158. ' $0240: 3e 3a fd c2 49 fa 00 84 61 62 30 2e 00 08 08 80 
  159. ' $0250: 00 00 08 80 00 01 08 80 00 04 4c df 7f fe 4e 75 
  160. ' $0260: 20 2f 00 04 48 e7 7f fe 2c 40 2a 7a fd 94 3e 3a 
  161. ' $0270: fd 94 49 fa 00 56 61 34 4c ae 00 0f 00 0a d4 40 
  162. ' $0280: d6 41 52 41 53 42 48 94 00 0f 34 00 61 72 4c 94 
  163. ' $0290: 00 0f 32 03 61 6a 30 2e 00 08 08 80 00 00 08 80 
  164. ' $02a0: 00 01 08 80 00 04 4c df 7f fe 4e 75 70 00 61 32 
  165. ' $02b0: 4c ae 00 0f 00 0a d4 40 d6 41 57 40 55 41 54 42 
  166. ' $02c0: 56 43 38 02 3a 03 34 00 60 44 00 cc 00 91 ff ff 
  167. ' $02d0: ff ff 22 6d 00 08 48 91 00 0f 41 fa 00 c0 60 00 
  168. ' $02e0: 00 a8 22 6d 00 04 32 80 41 fa 00 be 60 00 00 9a 
  169. ' $02f0: 22 6d 00 08 48 91 00 0f 41 fa 00 ba 60 00 00 8a 
  170. ' $0300: 22 6d 00 08 48 91 00 0f 41 fa 00 b6 60 7a 22 6d 
  171. ' $0310: 00 08 48 91 00 3f 41 fa 00 c0 60 6c 22 6d 00 08 
  172. ' $0320: 32 80 33 41 00 02 48 94 00 03 22 6d 00 04 20 42 
  173. ' $0330: 70 00 72 00 74 00 39 7c ff ff 00 06 52 41 10 18 
  174. ' $0340: b0 3c 00 5b 66 08 d5 54 42 6c 00 06 60 f0 d4 7a 
  175. ' $0350: fc b6 32 c0 66 e6 41 fa 00 74 53 41 31 41 00 06 
  176. ' $0360: 4a 6c 00 04 6b 22 4a 6c 00 06 6b 1c 61 1a 4c 94 
  177. ' $0370: 00 03 34 3a fc 94 e6 42 d2 42 36 01 34 00 d4 7a 
  178. ' $0380: fc 86 53 42 60 00 ff 7a 22 55 4c 90 00 3f 48 91 
  179. ' $0390: 00 bf 22 0d 30 3c 00 73 4e 42 4e 75 00 0b 00 02 
  180. ' $03a0: 00 00 00 00 00 00 00 05 00 17 00 00 00 00 00 01 
  181. ' $03b0: 00 01 00 00 00 0b 00 02 00 00 00 00 00 00 00 01 
  182. ' $03c0: 00 06 00 02 00 00 00 00 00 00 00 00 00 08 00 01 
  183. ' $03d0: 00 00 00 04 00 00 00 00 00 09 00 03 00 00 00 00 
  184. ' $03e0: 00 00 00 00 
  185. ' 996  Bytes.
  186.   INLINE inl%,996
  187.   '
  188. RETURN
  189. > PROCEDURE prepare_rsc(t_max&,pop&,r_fl!,e_fl!,m_fl!) !installiert "CreepDials"
  190.   '
  191.   ' t_max& => Index des letzten Objektbaums der RSC
  192.   ' pop&   => Index des Popup-Objektbaums
  193.   ' r_fl!  => runde/eckige Radiobuttons (Flag)
  194.   ' e_fl!  => "FlyDials"/"ChickenDials" (Flag)
  195.   ' m_fl!  => Dialog zentrieren/relativ zur Maus (Flag)
  196.   '
  197.   ' Felder:
  198.   ' t_a%(t_c&)     => Adressen der Objektbäume
  199.   ' t_inf&(t_c&,0) => X-Koordinate der Dialogbox
  200.   ' t_inf&(t_c&,1) => Y-Koordinate der Dialogbox
  201.   ' t_inf&(t_c&,2) => Breite der Dialogbox
  202.   ' t_inf&(t_c&,3) => Höhe der Dialogbox
  203.   ' t_inf&(t_c&,4) => Index der Verschiebungs-Ecke
  204.   ' t_inf&(t_c&,5) => interner Zähler
  205.   ' t_inf&(t_c&,6) => Index des letzten Objekts des Baumes
  206.   ' t_inf&(t_c&,7) => Index des ersten Editobjekts (wenn vorhanden)
  207.   ' t_inf&(t_c&,8) => interner Zähler
  208.   ' t_inf&(t_c&,9) => Index des Abbruch-Buttons (wenn vorhanden)
  209.   ' para%(0)       => max. horizontale Pixelposition
  210.   ' para%(1)       => max. vertikale Pixelposition
  211.   ' para%(2)       => Zeichenzellenbreite
  212.   ' para%(3)       => Zeichenzellenhöhe
  213.   ' para%(4)       => Adresse der Tastencode-Umwandlungstabelle (unshift)
  214.   ' para%(5)       => Adresse der Tastencode-Umwandlungstabelle (shift)
  215.   ' para%(6)       => Dialog zentrieren/relativ zur Maus (Flag)
  216.   ' para%(7)       => Index des Popup-Objektbaumes
  217.   '
  218.   '
  219.   LOCAL txt$
  220.   LOCAL inl%,rsc_mem%,pop_mem%
  221.   LOCAL ob_max&,ob_c&,user_c&,t_c&
  222.   LOCAL xz&,yz&,offset&,i&,flag&,b&,n_ob&
  223.   '
  224.   DIM vdi_pb%(4),para%(7)
  225.   DIM t_a%(t_max&)
  226.   DIM t_inf&(t_max&,9)
  227.   DIM q_ras0&(9),z_ras0&(9)
  228.   DIM q_ras1&(9),z_ras1&(9)
  229.   DIM q_ras2&(9),z_ras2&(9)
  230.   '
  231.   ' Resource-Info holen:
  232.   '
  233.   FOR t_c&=0 TO t_max&
  234.     '
  235.     ~RSRC_GADDR(0,t_c&,t_a%(t_c&))                 !Baumadresse ermitteln
  236.     '
  237.     ' "Hey Anton, noch mal Danke für den Hinweis."
  238.     '
  239.     WHILE NOT BTST(OB_FLAGS(t_a%(t_c&),t_inf&(t_c&,6)),5)
  240.       '
  241.       i&=ROR(AND(OB_TYPE(t_a%(t_c&),t_inf&(t_c&,6)),&HFF00),8)
  242.       '
  243.       IF i&>=17 AND i&<=20
  244.         INC user_c&
  245.       ENDIF
  246.       '
  247.       INC t_inf&(t_c&,6)
  248.       '
  249.     WEND
  250.     '
  251.     ob_max&=MAX(ob_max&,t_inf&(t_c&,6))
  252.     '
  253.   NEXT t_c&
  254.   '
  255.   DEC ob_max&
  256.   DIM userblk%(user_c&*2)
  257.   DIM char&(t_max&,ob_max&,1),xy&(t_max&,ob_max&,3)
  258.   CLR user_c&
  259.   para%(6)=m_fl!
  260.   para%(7)=pop&
  261.   '
  262.   ' Aktuelle Auflösung ermitteln:
  263.   '
  264.   CONTRL(2)=6
  265.   INTIN(0)=0
  266.   VDISYS 102,1,0,0
  267.   para%(0)=INTOUT(0)                              !max. X
  268.   para%(1)=INTOUT(1)                              !max. Y
  269.   '
  270.   ' Anzahl der Bitplanen ermitteln:
  271.   '
  272.   CONTRL(2)=6
  273.   INTIN(0)=1
  274.   VDISYS 102,1,0,0
  275.   z_ras0&(6)=INTOUT(4)
  276.   z_ras1&(6)=INTOUT(4)
  277.   z_ras2&(6)=INTOUT(4)
  278.   '
  279.   ' Zeichenzellenbreite und -höhe ermitteln:
  280.   '
  281.   CONTRL(2)=2
  282.   CONTRL(4)=6
  283.   VDISYS 38
  284.   para%(2)=PTSOUT(2)                               !Zeichenzellenbreite
  285.   para%(3)=PTSOUT(3)                               !Zeichenzellenhöhe
  286.   '
  287.   ' Adressen der Scancodetabellen holen:
  288.   '
  289.   para%(4)={XBIOS(16,L:-1,L:-1,L:-1)}              !unshift
  290.   para%(5)={XBIOS(16,L:-1,L:-1,L:-1)+4}            !shift
  291.   '
  292.   vdi_pb%(0)=CONTRL
  293.   vdi_pb%(1)=INTIN
  294.   vdi_pb%(2)=PTSIN
  295.   vdi_pb%(3)=INTOUT
  296.   vdi_pb%(4)=PTSOUT
  297.   '
  298.   assm_modul
  299.   LPOKE inl%,V:vdi_pb%(0)
  300.   DPOKE inl%+4,V~H
  301.   DPOKE inl%+6,para%(2)
  302.   DPOKE inl%+8,para%(3)
  303.   '
  304.   ' größte Popup-Box ermitteln:
  305.   '
  306.   IF pop&>=0                                       !Popup
  307.     n_ob&=1
  308.     '
  309.     WHILE n_ob&<>0
  310.       '
  311.       b&=((OB_W(t_a%(pop&),n_ob&)+21) DIV 16)*16   !Breite an 16 Pixel-Grenze
  312.       pop_mem%=MAX(pop_mem%,b&*(OB_H(t_a%(pop&),n_ob&)+5)) !Breite * Höhe
  313.       '
  314.       n_ob&=OB_NEXT(t_a%(pop&),n_ob&)              !nächste Popup-Box
  315.     WEND
  316.     '
  317.   ENDIF
  318.   '
  319.   ' Objektbäume modifizieren:
  320.   '
  321.   FOR t_c&=0 TO t_max&
  322.     '
  323.     FOR ob_c&=0 TO t_inf&(t_c&,6)
  324.       '
  325.       SELECT ROR(AND(OB_TYPE(t_a%(t_c&),ob_c&),&HFF00),8)
  326.         '
  327.       CASE 17                                      !Ecke
  328.         t_inf&(t_c&,4)=ob_c&
  329.         IF e_fl!
  330.           instal_g_user(inl%+562)                  !"FlyDials"-Ecke
  331.         ELSE
  332.           instal_g_user(inl%+608)                  !"ChickenDials"-Ecke
  333.         ENDIF
  334.       CASE 18                                      !Button
  335.         '
  336.         txt$=CHAR{OB_SPEC(t_a%(t_c&),ob_c&)}
  337.         offset&=PRED(INSTR(txt$,"["))
  338.         '
  339.         IF offset&>=0
  340.           char&(t_c&,t_inf&(t_c&,5),0)=ASC(UPPER$(MID$(txt$,offset&+2,1)))
  341.           char&(t_c&,t_inf&(t_c&,5),1)=ob_c&
  342.           INC t_inf&(t_c&,5)
  343.         ENDIF
  344.         '
  345.         flag&=OB_FLAGS(t_a%(t_c&),ob_c&)
  346.         '
  347.         IF BTST(flag&,2)                           !Exit-Button
  348.           '
  349.           IF offset&>=0
  350.             '
  351.             txt$=LEFT$(txt$,offset&)+RIGHT$(txt$,LEN(txt$)-SUCC(offset&))
  352.             CHAR{OB_SPEC(t_a%(t_c&),ob_c&)}=txt$
  353.             '
  354.             OB_Y(t_a%(t_c&),ob_c&)=OB_Y(t_a%(t_c&),ob_c&)-2
  355.             OB_H(t_a%(t_c&),ob_c&)=OB_H(t_a%(t_c&),ob_c&)+2
  356.             '
  357.             ~OBJC_OFFSET(t_a%(t_c&),ob_c&,xz&,yz&)
  358.             xz&=xz&+OB_W(t_a%(t_c&),ob_c&)/2-LEN(txt$)*para%(2)/2+para%(2)/2
  359.             yz&=yz&+OB_H(t_a%(t_c&),ob_c&)/2+para%(3)/2
  360.             '
  361.             xy&(t_c&,t_inf&(t_c&,8),0)=xz&+offset&*para%(2)
  362.             xy&(t_c&,t_inf&(t_c&,8),2)=xy&(t_c&,t_inf&(t_c&,8),0)+para%(2)-2
  363.             xy&(t_c&,t_inf&(t_c&,8),1)=yz&+2
  364.             xy&(t_c&,t_inf&(t_c&,8),3)=xy&(t_c&,t_inf&(t_c&,8),1)
  365.             INC t_inf&(t_c&,8)
  366.             '
  367.           ENDIF
  368.           '
  369.           IF UPPER$(txt$)="ABBRUCH"
  370.             t_inf&(t_c&,9)=ob_c&
  371.           ENDIF
  372.           '
  373.         ELSE IF BTST(flag&,6) AND BYTE(OB_TYPE(t_a%(t_c&),ob_c&))=28  !String
  374.           '
  375.           IF offset&>=0
  376.             '
  377.             txt$=LEFT$(txt$,offset&)+RIGHT$(txt$,LEN(txt$)-SUCC(offset&))
  378.             CHAR{OB_SPEC(t_a%(t_c&),ob_c&)}=txt$
  379.             '
  380.             ~OBJC_OFFSET(t_a%(t_c&),ob_c&,xz&,yz&)
  381.             '
  382.             xy&(t_c&,t_inf&(t_c&,8),0)=xz&+offset&*para%(2)+3
  383.             xy&(t_c&,t_inf&(t_c&,8),2)=xy&(t_c&,t_inf&(t_c&,8),0)+para%(2)-2
  384.             xy&(t_c&,t_inf&(t_c&,8),1)=yz&+para%(3)+2
  385.             xy&(t_c&,t_inf&(t_c&,8),3)=xy&(t_c&,t_inf&(t_c&,8),1)
  386.             INC t_inf&(t_c&,8)
  387.             '
  388.           ENDIF
  389.           '
  390.         ELSE
  391.           '
  392.           IF offset&>=0
  393.             OB_W(t_a%(t_c&),ob_c&)=OB_W(t_a%(t_c&),ob_c&)+para%(2)*2
  394.           ELSE
  395.             OB_W(t_a%(t_c&),ob_c&)=OB_W(t_a%(t_c&),ob_c&)+para%(2)*3
  396.           ENDIF
  397.           '
  398.           IF BTST(flag&,4)                         !Radiobutton
  399.             '
  400.             IF r_fl!
  401.               instal_g_user(inl%+10)               !rund
  402.             ELSE
  403.               instal_g_user(inl%+134)              !eckig
  404.             ENDIF
  405.             '
  406.           ELSE IF BTST(flag&,0)                    !Checkbutton
  407.             instal_g_user(inl%+230)
  408.           ENDIF
  409.           '
  410.         ENDIF
  411.         '
  412.       CASE 19                                      !Unterstreichen
  413.         instal_g_user(inl%+480)
  414.       CASE 20                                      !Rahmen
  415.         instal_g_user(inl%+382)
  416.       CASE 22                                      !Popup
  417.         '
  418.         txt$=CHAR{{OB_SPEC(t_a%(t_c&),ob_c&)}}
  419.         offset&=PRED(INSTR(txt$,"["))
  420.         '
  421.         IF offset&>=0
  422.           char&(t_c&,t_inf&(t_c&,5),0)=ASC(UPPER$(MID$(txt$,offset&+2,1)))
  423.           char&(t_c&,t_inf&(t_c&,5),1)=ob_c&
  424.           INC t_inf&(t_c&,5)
  425.           '
  426.           txt$=LEFT$(txt$,offset&)+RIGHT$(txt$,LEN(txt$)-SUCC(offset&))
  427.           CHAR{{OB_SPEC(t_a%(t_c&),ob_c&)}}=txt$
  428.           '
  429.           ~OBJC_OFFSET(t_a%(t_c&),ob_c&,xz&,yz&)
  430.           '
  431.           xy&(t_c&,t_inf&(t_c&,8),0)=xz&+offset&*para%(2)+3
  432.           xy&(t_c&,t_inf&(t_c&,8),2)=xy&(t_c&,t_inf&(t_c&,8),0)+para%(2)-2
  433.           xy&(t_c&,t_inf&(t_c&,8),1)=yz&+para%(3)+3
  434.           xy&(t_c&,t_inf&(t_c&,8),3)=xy&(t_c&,t_inf&(t_c&,8),1)
  435.           INC t_inf&(t_c&,8)
  436.           '
  437.           OB_W(t_a%(t_c&),ob_c&)=OB_W(t_a%(t_c&),ob_c&)-para%(2)
  438.           OB_H(t_a%(t_c&),ob_c&)=OB_H(t_a%(t_c&),ob_c&)+2
  439.           '
  440.         ENDIF
  441.         '
  442.       ENDSELECT
  443.       '
  444.       IF (OB_FLAGS(t_a%(t_c&),ob_c&) AND 8) AND t_inf&(t_c&,7)=0
  445.         t_inf&(t_c&,7)=ob_c&                       !erstes Editobjekt
  446.       ENDIF
  447.       '
  448.     NEXT ob_c&
  449.     '
  450.     DEC t_inf&(t_c&,5)                             !char_count
  451.     DEC t_inf&(t_c&,8)                             !line_count
  452.     '
  453.     ~FORM_CENTER(t_a%(t_c&),t_inf&(t_c&,0),t_inf&(t_c&,1),t_inf&(t_c&,2),t_inf&(t_c&,3))
  454.     '
  455.     ' Größe der vom größten Dialog bedeckten Fläche:
  456.     '
  457.     b&=((OB_W(t_a%(t_c&),0)+21) DIV 16)*16         !Breite an 16 Pixel-Grenze
  458.     rsc_mem%=MAX(rsc_mem%,b&*(OB_H(t_a%(t_c&),0)+6)) !Breite * Höhe
  459.     '
  460.   NEXT t_c&
  461.   '
  462.   ' Größe der benötigten Speicherblocks ermitteln und anfordern:
  463.   '
  464.   pop_mem%=(z_ras0&(6)*pop_mem%) DIV 8             !(Fläche * Bitplanen) / 8
  465.   rsc_mem%=(z_ras0&(6)*rsc_mem%) DIV 8             !(Fläche * Bitplanen) / 8
  466.   error%=MALLOC(2*rsc_mem%+pop_mem%)
  467.   '
  468.   LPOKE V:z_ras0&(0),error%
  469.   LPOKE V:z_ras1&(0),error%+rsc_mem%
  470.   LPOKE V:z_ras2&(0),error%+2*rsc_mem%
  471.   '
  472. RETURN
  473. > PROCEDURE do_dial(i&,VAR b&)                     !komplette Dialogverwaltung
  474.   '
  475.   ' i& => Index des Dialogs
  476.   ' b& => Index des betätigten Buttons (back)
  477.   '
  478.   LOCAL pop_flag!
  479.   '
  480.   draw_dial(i&)
  481.   '
  482.   REPEAT
  483.     form_do(i&,b&)
  484.     '
  485.     pop_flag!=TRUE
  486.     '
  487.     IF i&=dialog&                                  !nur bei best. Dialog
  488.       '
  489.       IF b&=sex_but& OR b&=sex&                    !"Geschlecht"-Popup
  490.         popup_select(i&,sex_but&,sex_box&,geschl&,geschl&)
  491.         pop_flag!=FALSE
  492.       ENDIF
  493.       '
  494.       IF b&=option&                                !"Optionen"-Popup
  495.         popup_menu(i&,option&,option_box&,1,opt&)
  496.         pop_flag!=FALSE
  497.         '
  498.         SELECT opt&
  499.         CASE 0
  500.           ALERT 1,"|Eine GEM-Library |von Manuel Hermann. ",1,"  OK  ",dummy|
  501.         CASE 1
  502.           ALERT 1,"|Magazin plus Software |für den ATARI ST & TT ",1,"  OK  ",dummy|
  503.         CASE 2
  504.           ALERT 1,"|Many greetings to |all members of |THE INDEPENDENT.",1,"  YO!  ",dummy|
  505.         CASE 3
  506.           ALERT 1,"|hilfreiche Bücher: |'Vom Anfänger zum GEM-Profi' |'ATARI Profibuch ST-STE-TT'",1,"  OK  ",dummy|
  507.         ENDSELECT
  508.         '
  509.       ENDIF
  510.       '
  511.     ENDIF
  512.     '
  513.   UNTIL pop_flag!
  514.   '
  515.   undraw_dial(i&)
  516. RETURN
  517. > PROCEDURE popup_select(b_t&,but&,ob&,def&,VAR st&) !Auswahl
  518.   '
  519.   ' b_i& => Index des Dialogs
  520.   ' but& => Index des betätigten Buttons
  521.   ' ob&  => Index des Popups
  522.   ' def& => Default-Eintrag
  523.   ' st&  => betätigter Eintrag (back)
  524.   '
  525.   popup(-1,b_t&,but&,ob&,def&,st&)
  526. RETURN
  527. > PROCEDURE popup_menu(b_t&,but&,ob&,pl&,VAR st&)  !Menu
  528.   '
  529.   ' b_i& => Index des Dialogs
  530.   ' but& => Index des betätigten Buttons
  531.   ' ob&  => Index des Popups
  532.   ' pl&  => Popup wird relativ zu diesem Eintrag ausgerichtet
  533.   ' st&  => betätigter Eintrag (back)
  534.   '
  535.   popup(0,b_t&,but&,ob&,pl&,st&)
  536. RETURN
  537. > PROCEDURE mem_free                               !gibt Speicher zurück
  538.   ~MFREE(error%)
  539. RETURN
  540. '
  541. > PROCEDURE popup(fl!,t_i&,but&,ob&,def&,VAR st&)  !Popup-Verwaltung
  542.   '
  543.   ' fl!  => select/menu (Flag)
  544.   ' t_i& => Index des Dialogs
  545.   ' but& => Index des betätigten Buttons
  546.   ' ob&  => Index des Popups
  547.   ' def& => Default-Eintrag
  548.   ' st&  => betätigter Eintrag (back)
  549.   '
  550.   LOCAL n_ob&,ob_cn&,x&,y&,b&,h&,i&
  551.   LOCAL mx&,my&,mb&,ks&,kr&,br&,m_flag!
  552.   LOCAL akt_ob&,old_ob&,key_ob&,first&
  553.   '
  554.   ' Anzahl der Einträge ermitteln:
  555.   '
  556.   first&=OB_HEAD(t_a%(para%(7)),ob&)               !erster Eintrag
  557.   br&=first&
  558.   WHILE br&<>ob&
  559.     br&=OB_NEXT(t_a%(para%(7)),br&)                !nächster Eintrag
  560.     INC ob_cn&
  561.   WEND
  562.   DEC ob_cn&
  563.   '
  564.   ~OBJC_OFFSET(t_a%(t_i&),but&,x&,y&)
  565.   OB_X(t_a%(para%(7)),0)=(x&+OB_W(t_a%(t_i&),but&) DIV 2)-(OB_X(t_a%(para%(7)),ob&)+OB_W(t_a%(para%(7)),ob&) DIV 2)
  566.   OB_Y(t_a%(para%(7)),0)=MAX(para%(3)+4,MIN(para%(1)-4-OB_H(t_a%(para%(7)),ob&),y&-def&*para%(3)))-OB_Y(t_a%(para%(7)),ob&)
  567.   '
  568.   x&=OB_X(t_a%(para%(7)),0)+OB_X(t_a%(para%(7)),ob&)-1
  569.   y&=OB_Y(t_a%(para%(7)),0)+OB_Y(t_a%(para%(7)),ob&)-1
  570.   b&=OB_W(t_a%(para%(7)),ob&)+4
  571.   h&=OB_H(t_a%(para%(7)),ob&)+4
  572.   '
  573.   scr2mem(2,x&,y&,b&,h&)
  574.   ~OBJC_DRAW(t_a%(para%(7)),0,7,x&,y&,b&,h&)
  575.   '
  576.   IF fl!
  577.     '
  578.     ' Default-Eintrag mit Häckchen versehen:
  579.     '
  580.     GRAPHMODE 2
  581.     INTIN(0)=8
  582.     INTIN(1)=0
  583.     PTSIN(0)=x&+para%(2)/2
  584.     PTSIN(1)=y&-para%(3)/6+SUCC(def&)*para%(3)
  585.     VDISYS 8,2,1
  586.     GRAPHMODE 0
  587.     '
  588.   ENDIF
  589.   '
  590.   akt_ob&=first&+def&
  591.   old_ob&=akt_ob&
  592.   key_ob&=akt_ob&
  593.   '
  594.   ~OBJC_CHANGE(t_a%(para%(7)),akt_ob&,0,x&,y&,b&,h&,1,1)
  595.   '
  596.   ~EVNT_TIMER(200)
  597.   ~GRAF_MKSTATE(mx&,my&,mb&,ks&)
  598.   '
  599.   IF mb&=1
  600.     m_flag!=TRUE
  601.     which&=4
  602.   ENDIF
  603.   '
  604.   DO
  605.     '
  606.     IF NOT m_flag!
  607.       which&=EVNT_MULTI(7,1,1,1,1,mx&,my&,1,1,0,0,0,0,0,0,0,mx&,my&,mb&,ks&,kr&,br&)
  608.     ELSE
  609.       ~GRAF_MKSTATE(mx&,my&,mb&,ks&)
  610.     ENDIF
  611.     '
  612.     IF which& AND 1                                !Tastaturereignis
  613.       '
  614.       IF akt_ob&<first& OR akt_ob&>first&+ob_cn&
  615.         SELECT ROR(AND(kr&,&HFF00),8)
  616.         CASE 72,80
  617.           akt_ob&=key_ob&
  618.         ENDSELECT
  619.       ELSE
  620.         br&=akt_ob&
  621.         '
  622.         SELECT ROR(AND(kr&,&HFF00),8)
  623.         CASE 72
  624.           IF akt_ob&>first&
  625.             DEC akt_ob&
  626.             DO WHILE NOT BTST(3,OB_STATE(t_a%(para%(7)),akt_ob&))
  627.               EXIT IF akt_ob&<first&
  628.               DEC akt_ob&
  629.             LOOP
  630.             IF akt_ob&<first&
  631.               akt_ob&=br&
  632.             ENDIF
  633.           ENDIF
  634.         CASE 80
  635.           IF akt_ob&<first&+ob_cn&
  636.             INC akt_ob&
  637.             DO WHILE NOT BTST(3,OB_STATE(t_a%(para%(7)),akt_ob&))
  638.               EXIT IF akt_ob&>first&+ob_cn&
  639.               INC akt_ob&
  640.             LOOP
  641.             IF akt_ob&>first&+ob_cn&
  642.               akt_ob&=br&
  643.             ENDIF
  644.           ENDIF
  645.         ENDSELECT
  646.         '
  647.       ENDIF
  648.       '
  649.     ENDIF
  650.     '
  651.     IF which& AND 4                                   !Mausereignis
  652.       akt_ob&=OBJC_FIND(t_a%(para%(7)),0,first&,mx&,my&)
  653.     ENDIF
  654.     '
  655.     IF akt_ob&<>old_ob&
  656.       ~OBJC_CHANGE(t_a%(para%(7)),old_ob&,0,x&,y&,b&,h&,0,1)
  657.     ENDIF
  658.     '
  659.     IF (akt_ob&>=first& AND akt_ob&<=first&+ob_cn&) AND BTST(3,OB_STATE(t_a%(para%(7)),akt_ob&))
  660.       ~OBJC_CHANGE(t_a%(para%(7)),akt_ob&,0,x&,y&,b&,h&,1,1)
  661.       '
  662.       old_ob&=akt_ob&
  663.       key_ob&=akt_ob&
  664.       st&=akt_ob&-first&
  665.     ENDIF
  666.     '
  667.   LOOP UNTIL ((which& AND 2) OR ((which& AND 1) AND BYTE(kr&)=13)) OR (mb&<>1 AND m_flag!)
  668.   '
  669.   mem2scr(2,x&,y&,b&,h&)
  670.   '
  671.   IF st&=akt_ob&-first&
  672.     '
  673.     ~OBJC_CHANGE(t_a%(para%(7)),akt_ob&,0,x&,y&,b&,h&,0,0)
  674.     '
  675.     IF fl!
  676.       '
  677.       ' neuen Default-Text in Button eintragen:
  678.       '
  679.       CHAR{{OB_SPEC(t_a%(t_i&),but&)}}=CHAR{OB_SPEC(t_a%(para%(7)),akt_ob&)}
  680.       '
  681.       ' Button neu zeichnen:
  682.       '
  683.       ~OBJC_OFFSET(t_a%(t_i&),but&,x&,y&)
  684.       ~OBJC_DRAW(t_a%(t_i&),0,7,x&,y&,OB_W(t_a%(t_i&),but&),OB_H(t_a%(t_i&),but&))
  685.       '
  686.     ENDIF
  687.     '
  688.   ELSE
  689.     ~OBJC_CHANGE(t_a%(para%(7)),old_ob&,0,x&,y&,b&,h&,32,0)
  690.     '
  691.     IF fl!
  692.       st&=def&
  693.     ELSE
  694.       st&=-1
  695.     ENDIF
  696.     '
  697.   ENDIF
  698.   '
  699.   ' warten bis Maustaste wieder losgelassen wird:
  700.   '
  701.   REPEAT
  702.     ~GRAF_MKSTATE(mx&,my&,mb&,ks&)
  703.   UNTIL mb&=0
  704.   '
  705. RETURN
  706. > PROCEDURE move_dial                              !Dialog verschieben
  707.   '
  708.   scr2mem(1,t_inf&(t_i&,0),t_inf&(t_i&,1),t_inf&(t_i&,2),t_inf&(t_i&,3))
  709.   '
  710.   IF BTST(next_ob&,31)
  711.     '
  712.     mem2scr(0,t_inf&(t_i&,0),t_inf&(t_i&,1),t_inf&(t_i&,2),t_inf&(t_i&,3))
  713.     ~FORM_CENTER(t_a%(t_i&),t_inf&(t_i&,0),t_inf&(t_i&,1),t_inf&(t_i&,2),t_inf&(t_i&,3))
  714.     '
  715.   ELSE
  716.     '
  717.     DEFMOUSE 4
  718.     '
  719.     IF BTST(ks&,3)                               !Alternate-Taste gedrückt?
  720.       mem2scr(0,t_inf&(t_i&,0),t_inf&(t_i&,1),t_inf&(t_i&,2),t_inf&(t_i&,3))
  721.       ~GRAF_DRAGBOX(t_inf&(t_i&,2),t_inf&(t_i&,3),t_inf&(t_i&,0),t_inf&(t_i&,1),0,para%(3)+2,SUCC(para%(0)),para%(1)-SUCC(para%(3)),x&,y&)
  722.     ELSE
  723.       ~GRAF_DRAGBOX(t_inf&(t_i&,2),t_inf&(t_i&,3),t_inf&(t_i&,0),t_inf&(t_i&,1),0,para%(3)+2,SUCC(para%(0)),para%(1)-SUCC(para%(3)),x&,y&)
  724.       mem2scr(0,t_inf&(t_i&,0),t_inf&(t_i&,1),t_inf&(t_i&,2),t_inf&(t_i&,3))
  725.     ENDIF
  726.     '
  727.     t_inf&(t_i&,0)=x&
  728.     t_inf&(t_i&,1)=y&
  729.     '
  730.     OB_X(t_a%(t_i&),0)=t_inf&(t_i&,0)+3
  731.     OB_Y(t_a%(t_i&),0)=t_inf&(t_i&,1)+3
  732.     '
  733.     DEFMOUSE 0
  734.   ENDIF
  735.   '
  736.   scr2mem(0,t_inf&(t_i&,0),t_inf&(t_i&,1),t_inf&(t_i&,2),t_inf&(t_i&,3))
  737.   mem2scr(1,t_inf&(t_i&,0),t_inf&(t_i&,1),t_inf&(t_i&,2),t_inf&(t_i&,3))
  738.   '
  739. RETURN
  740. > PROCEDURE form_do(t_i&,VAR back&)                !erweiterte FORM_DO-Routine
  741.   '
  742.   ' t_i&  => Index des Dialogs
  743.   ' back& => Index des betätigten Buttons (back)
  744.   '
  745.   LOCAL edit_ob&,next_ob&,cont&,which&,x&,y&
  746.   LOCAL mx&,my&,mb&,ks&,kr&,br&,idx&,i&
  747.   LOCAL scan|,keytab%
  748.   '
  749.   DO
  750.     '
  751.     next_ob&=t_inf&(t_i&,7)                        !erstes Editobjekt
  752.     CLR edit_ob&
  753.     cont&=TRUE
  754.     '
  755.     WHILE cont&
  756.       '
  757.       IF next_ob&<>0 AND edit_ob&<>next_ob&
  758.         edit_ob&=next_ob&
  759.         next_ob&=0
  760.         ~OBJC_EDIT(t_a%(t_i&),edit_ob&,0,idx&,1,idx&)
  761.       ENDIF
  762.       '
  763.       which&=EVNT_MULTI(3,2,1,1,0,0,0,0,0,0,0,0,0,0,0,0,mx&,my&,mb&,ks&,kr&,br&)
  764.       '
  765.       IF which& AND 1                              !Tastaturereignis
  766.         '
  767.         cont&=FORM_KEYBD(t_a%(t_i&),edit_ob&,kr&,next_ob&,next_ob&,kr&)
  768.         '
  769.         IF BYTE(kr&)=0                             !Kein ASCII-Code (Alternate)
  770.           '
  771.           scan|=ROR(AND(kr&,&HFF00),8)
  772.           '
  773.           IF scan|=97 AND t_inf&(t_i&,9)<>0        !Undo
  774.             cont&=FORM_BUTTON(t_a%(t_i&),t_inf&(t_i&,9),br&,next_ob&)
  775.           ENDIF
  776.           '
  777.           IF scan|>=120 AND scan|<=129
  778.             SUB scan|,118
  779.             keytab%=para%(4)
  780.           ELSE
  781.             keytab%=para%(5)
  782.           ENDIF
  783.           '
  784.           FOR i&=0 TO t_inf&(t_i&,5)
  785.             IF PEEK(keytab%+scan|)=char&(t_i&,i&,0)
  786.               cont&=FORM_BUTTON(t_a%(t_i&),char&(t_i&,i&,1),br&,next_ob&)
  787.             ENDIF
  788.           NEXT i&
  789.           '
  790.         ENDIF
  791.         '
  792.         IF kr&
  793.           ~OBJC_EDIT(t_a%(t_i&),edit_ob&,kr&,idx&,2,idx&)
  794.         ENDIF
  795.         '
  796.       ENDIF
  797.       '
  798.       IF which& AND 2                                !Mausereignis
  799.         next_ob&=OBJC_FIND(t_a%(t_i&),0,t_inf&(t_i&,6),mx&,my&)
  800.         IF next_ob&=-1
  801.           OUT 2,7                                    !"Ping"
  802.           next_ob&=0
  803.         ELSE
  804.           cont&=FORM_BUTTON(t_a%(t_i&),next_ob&,br&,next_ob&)
  805.         ENDIF
  806.       ENDIF
  807.       '
  808.       IF (NOT cont& OR NOT next_ob&) AND next_ob&<>edit_ob&
  809.         ~OBJC_EDIT(t_a%(t_i&),edit_ob&,0,idx&,3,idx&)
  810.       ENDIF
  811.       '
  812.     WEND
  813.     '
  814.     EXIT IF next_ob&<>t_inf&(t_i&,4) AND NOT BTST(next_ob&,31)   !Exit-Flag
  815.     '
  816.     IF next_ob&=0                                    !ROOT is mover
  817.       ~OBJC_EDIT(t_a%(t_i&),edit_ob&,0,idx&,3,idx&)  !GEM-Cursor aus
  818.     ENDIF
  819.     '
  820.     move_dial                                      !Dialog verschieben
  821.     '
  822.   LOOP
  823.   '
  824.   back&=next_ob&
  825.   '
  826. RETURN
  827. > PROCEDURE draw_dial(t_i&)                        !zeichnet Dialog
  828.   '
  829.   ' t_i& => Index des Dialogs
  830.   '
  831.   LOCAL i&,bx&,by&,x&,y&
  832.   '
  833.   BOUNDARY 1
  834.   DEFLINE 1,0,0,0
  835.   DEFFILL 1,0,0
  836.   COLOR 1
  837.   DEFTEXT 1
  838.   '
  839.   IF para%(6)                                      !relativ zum Mauszeiger
  840.     '
  841.     ~GRAF_MKSTATE(x&,y&,i&,i&)
  842.     '
  843.     bx&=x&-(OB_W(t_a%(t_i&),0)-6) DIV 2
  844.     by&=y&-(OB_H(t_a%(t_i&),0)-6) DIV 2
  845.     '
  846.     OB_X(t_a%(t_i&),0)=MAX(3,MIN(para%(0)-OB_W(t_a%(t_i&),0)-3,bx&))
  847.     OB_Y(t_a%(t_i&),0)=MAX(para%(3)+6,MIN(para%(1)-OB_H(t_a%(t_i&),0)-3,by&))
  848.     t_inf&(t_i&,0)=OB_X(t_a%(t_i&),0)-3
  849.     t_inf&(t_i&,1)=OB_Y(t_a%(t_i&),0)-3
  850.     '
  851.   ENDIF
  852.   '
  853.   ~WIND_UPDATE(1)
  854.   ~WIND_UPDATE(3)
  855.   '
  856.   ~FORM_DIAL(1,t_inf&(t_i&,0),t_inf&(t_i&,1),1,1,t_inf&(t_i&,0),t_inf&(t_i&,1),t_inf&(t_i&,2),t_inf&(t_i&,3))
  857.   scr2mem(0,t_inf&(t_i&,0),t_inf&(t_i&,1),t_inf&(t_i&,2),t_inf&(t_i&,3))
  858.   '
  859.   ~OBJC_DRAW(t_a%(t_i&),0,7,t_inf&(t_i&,0),t_inf&(t_i&,1),t_inf&(t_i&,2),t_inf&(t_i&,3))
  860.   '
  861.   ' Linien zeichnen:
  862.   '
  863.   FOR i&=0 TO t_inf&(t_i&,8)
  864.     PTSIN(0)=t_inf&(t_i&,0)+xy&(t_i&,i&,0)
  865.     PTSIN(1)=t_inf&(t_i&,1)+xy&(t_i&,i&,1)
  866.     PTSIN(2)=t_inf&(t_i&,0)+xy&(t_i&,i&,2)
  867.     PTSIN(3)=t_inf&(t_i&,1)+xy&(t_i&,i&,3)
  868.     VDISYS 6,0,2,0
  869.   NEXT i&
  870.   '
  871. RETURN
  872. > PROCEDURE undraw_dial(t_i&)                      !löscht Dialog
  873.   '
  874.   ' t_i& => Index des Dialogs
  875.   '
  876.   ~OBJC_CHANGE(t_a%(t_i&),b&,0,t_inf&(t_i&,0),t_inf&(t_i&,1),t_inf&(t_i&,2),t_inf&(t_i&,3),0,0)
  877.   '
  878.   mem2scr(0,t_inf&(t_i&,0),t_inf&(t_i&,1),t_inf&(t_i&,2),t_inf&(t_i&,3))
  879.   ~FORM_DIAL(2,t_inf&(t_i&,0),t_inf&(t_i&,1),1,1,t_inf&(t_i&,0),t_inf&(t_i&,1),t_inf&(t_i&,2),t_inf&(t_i&,3))
  880.   ~WIND_UPDATE(2)
  881.   ~WIND_UPDATE(0)
  882.   '
  883. RETURN
  884. > PROCEDURE instal_g_user(adr%)                    !erzeugt G_USERDEF-Struktur
  885.   '
  886.   ' adr% => Adresse der Assemblerroutine
  887.   '
  888.   userblk%(user_c&)=adr%
  889.   userblk%(user_c&+1)=OB_SPEC(t_a%(t_c&),ob_c&)
  890.   OB_SPEC(t_a%(t_c&),ob_c&)=V:userblk%(user_c&)
  891.   OB_TYPE(t_a%(t_c&),ob_c&)=24                     !G_USERDEF
  892.   ADD user_c&,2
  893. RETURN
  894. > PROCEDURE scr2mem(fl|,x&,y&,b&,h&)               !Speicher retten
  895.   '
  896.   ' fl|         => Hintergrund/Dialog/Popup (Flag)
  897.   ' x&,y&,b&,h& => Koordinaten des zurettenden Bereichs
  898.   '
  899.   ~GRAF_MOUSE(256,0)                               !HIDE CURSOR
  900.   '
  901.   PTSIN(0)=x&
  902.   PTSIN(1)=y&
  903.   PTSIN(2)=x&+b&-1
  904.   PTSIN(3)=y&+h&-1
  905.   PTSIN(4)=0
  906.   PTSIN(5)=0
  907.   PTSIN(6)=b&-1
  908.   PTSIN(7)=h&-1
  909.   '
  910.   INTIN(0)=3
  911.   '
  912.   SELECT fl|
  913.   CASE 0
  914.     z_ras0&(2)=b&
  915.     z_ras0&(3)=h&
  916.     z_ras0&(4)=((b&+15) DIV 16)
  917.     z_ras0&(5)=0
  918.     '
  919.     LPOKE CONTRL+14,V:q_ras0&(0)
  920.     LPOKE CONTRL+18,V:z_ras0&(0)
  921.   CASE 1
  922.     z_ras1&(2)=b&
  923.     z_ras1&(3)=h&
  924.     z_ras1&(4)=((b&+15) DIV 16)
  925.     z_ras1&(5)=0
  926.     '
  927.     LPOKE CONTRL+14,V:q_ras1&(0)
  928.     LPOKE CONTRL+18,V:z_ras1&(0)
  929.   CASE 2
  930.     z_ras2&(2)=b&
  931.     z_ras2&(3)=h&
  932.     z_ras2&(4)=((b&+15) DIV 16)
  933.     z_ras2&(5)=0
  934.     '
  935.     LPOKE CONTRL+14,V:q_ras2&(0)
  936.     LPOKE CONTRL+18,V:z_ras2&(0)
  937.   ENDSELECT
  938.   '
  939.   VDISYS 109,1,4                                  !COPY RASTER OPAQUE
  940.   '
  941.   ~GRAF_MOUSE(257,0)                              !SHOW CURSOR
  942.   '
  943. RETURN
  944. > PROCEDURE mem2scr(fl|,x&,y&,b&,h&)               !Speicher restaurieren
  945.   '
  946.   ' fl|         => Hintergrund/Dialog/Popup (Flag)
  947.   ' x&,y&,b&,h& => Koordinaten des zurestaurierenden Bereichs
  948.   '
  949.   ~GRAF_MOUSE(256,0)                               !HIDE CURSOR
  950.   '
  951.   PTSIN(0)=0
  952.   PTSIN(1)=0
  953.   PTSIN(2)=b&-1
  954.   PTSIN(3)=h&-1
  955.   PTSIN(4)=x&
  956.   PTSIN(5)=y&
  957.   PTSIN(6)=x&+b&-1
  958.   PTSIN(7)=y&+h&-1
  959.   '
  960.   INTIN(0)=3
  961.   '
  962.   SELECT fl|
  963.   CASE 0
  964.     LPOKE CONTRL+14,V:z_ras0&(0)
  965.     LPOKE CONTRL+18,V:q_ras0&(0)
  966.   CASE 1
  967.     LPOKE CONTRL+14,V:z_ras1&(0)
  968.     LPOKE CONTRL+18,V:q_ras1&(0)
  969.   CASE 2
  970.     LPOKE CONTRL+14,V:z_ras2&(0)
  971.     LPOKE CONTRL+18,V:q_ras2&(0)
  972.   ENDSELECT
  973.   '
  974.   VDISYS 109,1,4                                  !COPY RASTER OPAQUE
  975.   '
  976.   ~GRAF_MOUSE(257,0)                              !SHOW CURSOR
  977.   '
  978. RETURN
  979. '
  980. ' *****************************************************************************
  981.